\documentclass{ctexart}

\title{双链表的设计和实现}

\author{姓名：金文宽\\专业及学号：统计学3210105908}

\begin{document}

\maketitle

\section{项目设计思路}
首先定义一个List类，然后在其中内嵌一个Node类，包括了链表内的有效数据以及两个指针，分别指向前后两个数据。并且定义迭代器及其运算。

然后构造了各种函数来实现不同的功能，如初始化、清空链表、释放内存、获取迭代器、插入和弹出数据等。

\section{测试说明}
在测试文件中，首先设计了一个外部函数
\begin{verbatim}
  List<int>::iterator find(List<int> L, int x)
  {
      List<int>::iterator iter = L.begin();
      while (iter != L.end() )
      {
        if (*iter == x)
    	{
    		return iter;
    	}
    	iter++;
      }
      return L.end();
  } 
\end{verbatim}
这个函数的功能是在链表L中查找值x的节点的迭代器值，由于最后一个是NULL，因此如果没有找到该值，那么最后应该会返回NULL.

还写了一个比较简单的测试
\begin{verbatim}
  List<int> li;
  for (int i = 0; i < 100; i++)
  {
      li.push_back(i);
  } 
   
  for ( List<int>::iterator iter = li.begin(); iter != li.end(); )
  {
      if (*iter % 3 == 0)
      {
          iter = li.erase(iter);
      }
      else
      {
          std::cout << *iter << std::endl;
          ++iter;
      }
  }
\end{verbatim}
其实就是创建了一个链表li，然后依次插入了0～99这100个数字，并且删除了3的倍数（也删除了0），最终再输出了li，输出结果为
\begin{verbatim}

1
2
4
5
7
8
10
11
13
14
16
17
19
20
22
23
25
26
28
29
31
32
34
35
37
38
40
41
43
44
46
47
49
50
52
53
55
56
58
59
61
62
64
65
67
68
70
71
73
74
76
77
79
80
82
83
85
86
88
89
91
92
94
95
97
98

\end{verbatim}

然后是要求的操作，创建链表L，用push\_back依次插入1,2，3,4,5,输出L，iter=find(L,3)，erase(iter),输出L，iter=find(L,3),但是我遇到了麻烦，第一次输出L时没有问题，但是在erase(iter)时出现了Segmentation fault (core dumped)的错误......
我的代码如下
\begin{verbatim}
   List<int> L;
   for (int i = 1; i < 6; i++)
   {
       L.push_back(i);
   }
   for ( List<int>::iterator iter = L.begin(); iter != L.end(); )
   {
       std::cout << *iter << std::endl;
       ++iter;
   }
   List<int>::iterator itr = find(L, 3);
   itr = L.erase(itr);
\end{verbatim}
当我删除最后一行时，一切都是正常的，但是加上之后便出现了Segmentation fault (core dumped)的问题，我尝试
\begin{verbatim}
std::cout << *itr << std::endl;
\end{verbatim}
后，发现每次输出了不同的很大的值，我认为应该是出现了内存泄漏，但实在不知道怎么解决了......





\end{document}
